#include <iostream>
using namespace std;
class Base {
 public:
  Base() = default;
  Base(int val) : base_val_(val) {}
  virtual void func1() { cout << "Base::func1()" << endl; }
  virtual void func2() { cout << "Base::func2()" << endl; }

  void show() const { cout << "base_val_:" << base_val_ << endl; }

 private:
  int base_val_ = 0;
};
class Derived : public Base {
 public:
  Derived(int val) : Base(val) {}
  void func1() override { cout << "Derived::func1()" << endl; }
  virtual void func3() { cout << "Derived::func3" << endl; }  // 虚函数表里有他
  void show() const { cout << "derived_val:" << derived_val_ << endl; }

 private:
  int derived_val_ = 100;
};
// 单继承情况
void Test() {
  cout << sizeof(Base) << endl;
  cout << sizeof(Derived) << endl;
  Base* ptr = new Derived(10000);
  ptr->func1();
  ptr->Base::func1();
  ptr->func2();
  ptr->show();  // Base::show(ptr);
  (*ptr).show();

  // 非静态成员函数
  // void (Base::*func_p)(void) const = &Base::show;
  // Derived d1(9);
  // Derived* p1 = &d1;
  // Derived d2(99);
  // (p1->*func_p)();
  // (d2.*func_p)();
  // ptr->func3();  编译错误

  // 虚表地址： *(double*)ptr
  // 第一个虚函数的入口地址：
  // void** v_table_addr = *(void***)(ptr);
  // using func_type = void (*)(int);
  // func_type vf = (func_type)(v_table_addr[1]);

  delete ptr;
  // Derived d;
  // d.func1();
  // d.func2();
  // d.func3();
  // d.show();
  // cout << " ----------- " << endl;
  // d.Base::func1();
  // d.Base::func2();
  // d.Base::show();
  // cout << *((int*)(&d) + 2) << endl;  // base_val_
  // cout << *((int*)(&d) + 3) << endl;  // derived_val_
}
int main() {
  Test();
  return 0;
}